package dials.filter.impl;
import dials.dial.DialHelper;
import dials.dial.Dialable;
import dials.filter.FeatureFilter;
import dials.filter.FilterDataException;
import dials.filter.FilterDataHelper;
import dials.filter.StaticDataFilter;
import dials.messages.ContextualMessage;
import dials.messages.DataFilterApplicationMessage;
import dials.model.FeatureModel;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
public class DateRangeFeatureFilter extends FeatureFilter implements StaticDataFilter, Dialable {
public static final String START_DATE = "StartDate";
public static final String END_DATE = "EndDate";
private DateTime startDate;
private DateTime endDate;
@Override
public boolean filter() {
if (startDate.isAfterNow()) {
return false;
} else if (endDate != null && endDate.isBeforeNow()) {
return false;
}
return true;
}
@Override
public void applyStaticData(DataFilterApplicationMessage message) {
FilterDataHelper helper = new FilterDataHelper(message.getFilterData());
applyRequiredData(message, helper);
applyOptionalData(message, helper);
}
private void applyRequiredData(ContextualMessage message, FilterDataHelper helper) {
try {
startDate = helper.getData(START_DATE, DateTime.class);
recordSuccessfulDataApply(message, START_DATE);
} catch (FilterDataException e) {
recordUnsuccessfulDataApply(message, START_DATE, true, e.getMessage());
}
}
private void applyOptionalData(ContextualMessage message, FilterDataHelper helper) {
try {
endDate = helper.getData(END_DATE, DateTime.class);
recordSuccessfulDataApply(message, END_DATE);
} catch (FilterDataException e) {
recordUnsuccessfulDataApply(message, END_DATE, false, e.getMessage());
}
}
@Override
public void dial(ContextualMessage message, String filterName) {
FeatureModel feature = message.getFeature();
DialHelper helper = new DialHelper(feature.getFilter(filterName).getDial());
String dialPattern = helper.getDialPattern(message);
if (dialPattern.equals(DialHelper.ATTEMPTED)) {
message.performDialAdjustment(feature.getFeatureName(), filterName, END_DATE,
DateTimeFormat.forPattern("yyyy-MM-dd").print(endDate));
return;
}
Integer daysToAdd = consumeDialPattern(dialPattern);
if (daysToAdd != null) {
message.getExecutionContext().addExecutionStep("Dial with pattern " + dialPattern
+ " performed on " + getClass().getSimpleName());
endDate = endDate.plusDays(daysToAdd);
message.performDialAdjustment(feature.getFeatureName(), filterName, END_DATE,
DateTimeFormat.forPattern("yyyy-MM-dd").print(endDate));
message.getExecutionContext().addExecutionStep("Dial successfully executed. New end date is " + endDate);
if (endDate.isBeforeNow()) {
message.disableFeature(feature.getFeatureName());
message.getExecutionContext().addExecutionStep("End date is now surpassed, disabling feature.");
}
}
}
/**
* Dial pattern for DateRangeFeatureFilter is (Integer).
* <p/>
* Examples:
* 1 (Increase Pattern) - Add 1 day to end date.
* 5 (Increase Pattern) - Add 5 days to end date.
* -2 (Decrease Pattern) - Subtract 2 days from end date.
* <p/>
* Unit is implied as a day.
*/
@Override
public Integer consumeDialPattern(String pattern) {
try {
return Integer.parseInt(pattern);
} catch (NumberFormatException e) {
return null;
}
}
}